package cn.bj.yu.pool;

import java.util.concurrent.*;

/**
 * @author 周宇
 * @create 2020-08-14 13:55
 * new ThreadPoolExecutor.AbortPolicy() 银行满了，还有人进来，不处理这个人，抛出异常
 * new ThreadPoolExecutor.CallerRunsPolicy() 队列满了，但是不会抛出异常
 * new ThreadPoolExecutor.DiscardOldestPolicy() 队列满了，尝试去和最早的竞争，也不会抛出异常！
 * new ThreadPoolExecutor.DiscardPolicy() 队列满了，丢掉任务
 */
public class ThreadPoolExecutorDemo {
    public static void main(String[] args) {

        //获取CPU核数
        System.out.println(Runtime.getRuntime().availableProcessors());

        // 自定义线程池
        //最大线程到底该如何定义
        //1、CPU 密集型 几核，就是几，可以保证CPU效率最高
        //2、IO  密集型 > 判断你程序中是否耗时的IO
        //       程序  15个大型任务  io十分占用资源!
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                Runtime.getRuntime().availableProcessors(),
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardPolicy());
        try {
            //最大承载:Deque + max
            //超过 RejectedExecutionException
            for (int i = 1; i <= 9; i++) {
                //使用线程池之后，使用线程池来创建线程
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + " ok!");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池用完，程序结束，关闭线程池
            threadPool.shutdown();
        }
    }
}